// Die Klasse Teilchen wird deklariert
class Teilchen
{
  // INSTANZVARIABLEN
  PVector x, v, c, a;
  float r; // Teilchenradius
  float m = 1; // Teilchenmasse

  // KONSTRUKTOR
  // Im Hauptsketch können für xTemp, vTemp, ... konkrete Werte eingegeben werden
  Teilchen(PVector xTemp, PVector vTemp, float rTemp, PVector cTemp, PVector aTemp)
  {
    /* Nun werden die Instanzvariablen der Klasse Teilchen den Variablen  
     der Funktionen zugeordnet, die im Konstruktor erstellt wurden */
    x = xTemp; 
    v = vTemp;
    r = rTemp;
    c = cTemp;
    a = aTemp;
  }

  // METHODEN
  // Funktion für die Teilchenbewegung
  void move(float t, PVector g) //Funktion
  {
    a.add(g);
    v.add(PVector.mult(a, t));
    x.add(PVector.mult(v, t)); // v bleibt bei dieser Rechnung konstant
    a.mult(0); // a wird mit 0 multipliziert, damit a nicht immer weiter anwächst
  }

  // Funktion zum Zeichnen der Teilchen
  void zeichnen()
  {
    noStroke();
    fill(c.x, c.y, c.z);
    ellipse(x.x, x.y, r * 2, r * 2);
  }

  // Funktion für die Teilchenkollision
  void collision(Teilchen kollisionsPartner) 
  {
    PVector normal = PVector.sub(kollisionsPartner.x, x); // Der vektorielle Abstand zwischen zwei Teilchen wird berechnet 
    float distance = normal.mag(); // Der Betrag des Vektors "normal" wird distance genannt
    // Wenn sich die Teilchen nicht berühren, dann wirkt keine Kraft auf sie
    if (distance >= r + kollisionsPartner.r)
      return; // Die Funktion sofort verlassen
    normal.div(distance); // Erstellung des Einheitsvektors
    // Zu a wird ein negativer Wert hinzuaddiert (a = F/m)
    PVector force = PVector.mult(normal, 10 * (distance - (r + kollisionsPartner.r)));
    a.add(PVector.div(force, m));
  }

  // Funktion für die Teilchenreflexion an der Wand
  /* Im Hauptsketch kann man mit dem Wert für E die Energieänderung bei der 
   Teilchenreflexion an der Wand einstellen. Also abkühlen E < 1 oder heizen E > 1 */
  void wand(float E) 
  {
    if (x.x <= r)
    {
      v.x = -v.x * E;
      x.x = r;
    }
    if (x.y <= r)
    {
      v.y = -v.y * E;
      x.y = r;
    }
    if (x.x >= width - r) 
    {
      v.x = -v.x * E;
      x.x = width - r; // So dringen die Teilchen nicht in die Wände ein
    }
    if (x.y >= height - r) 
    {
      v.y = -v.y * E; 
      x.y = height - r; // So sinken die Teilchen nicht unter den unteren Rand
    }
  }
}